package com.powergame.appstates;

import com.jme3.app.Application;
import com.jme3.app.SimpleApplication;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager;
import com.jme3.math.ColorRGBA;
import com.jme3.niftygui.NiftyJmeDisplay;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Node;
import com.powergame.console.SayHelloCommand;
import com.powergame.main.PowerGame2DMain;
import com.powergame.model.Equipe;
import com.powergame.model.Jeu;
import com.powergame.model.Joueur;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.NiftyEventSubscriber;
import de.lessvoid.nifty.controls.CheckBox;
import de.lessvoid.nifty.controls.CheckBoxStateChangedEvent;
import de.lessvoid.nifty.controls.Console;
import de.lessvoid.nifty.controls.ConsoleCommands;
import de.lessvoid.nifty.controls.DropDown;
import de.lessvoid.nifty.controls.ListBox;
import de.lessvoid.nifty.controls.TextField;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.nifty.screen.ScreenController;
import java.util.ArrayList;

/**
 * StartScreenState.java
 *
 * Définit l'écran du menu
 *
 * @author ToF
 */
public class StartScreenState extends AbstractAppState implements ScreenController {
    
    private SimpleApplication application = null;
    private ViewPort viewPort;
    private Node rootNode;
    private Node guiNode;
    private AssetManager assetManager;
    private Node localRootNode = new Node("Start_RootNode");
    private Node localGuiNode = new Node("Start_GuiNode");
    private final ColorRGBA backgroundColor = ColorRGBA.Black;  
    
    public StartScreenState(SimpleApplication app){
        this.application = app;
        this.rootNode     = app.getRootNode();
        this.viewPort     = app.getViewPort();
        this.guiNode      = app.getGuiNode();
        this.assetManager = app.getAssetManager();  
        
        /** init the screen */    
        this.application.setDisplayFps(false);
        this.application.setDisplayStatView(false);
        this.application.getFlyByCamera().setEnabled(false);
        this.application.getFlyByCamera().setDragToRotate(true);
        
        // GUI
    }

    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        super.initialize(stateManager, app);
    }

    @Override
    public void update(float tpf) {
        /** any main loop action happens here */
    }

    @Override
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
    }
    
    @Override
    public void stateAttached(AppStateManager stateManager) {
        rootNode.attachChild(localRootNode);
        guiNode.attachChild(localGuiNode);
        viewPort.setBackgroundColor(backgroundColor);
    }

    @Override
    public void stateDetached(AppStateManager stateManager) {
        rootNode.detachChild(localRootNode);
        guiNode.detachChild(localGuiNode);
    }

    public void bind(Nifty nifty, Screen screen) {
        // Charge les listes
        DropDown<String> lst_joueur = null;
        String idListe = "";
        TextField txt = null;
        for(int i = 1; i <= 4; i++){
            txt = screen.findNiftyControl("txt_joueur" + i, TextField.class);
            txt.setEnabled(false);
            
            idListe = "lst_equipe" + i;
            lst_joueur = screen.findNiftyControl(idListe, DropDown.class);
            lst_joueur.addItem("");
            lst_joueur.addItem(Equipe.EQUIPE_BLEU.getLibelle());
            lst_joueur.addItem(Equipe.EQUIPE_ROUGE.getLibelle());
            lst_joueur.addItem(Equipe.EQUIPE_VERTE.getLibelle());
            lst_joueur.addItem(Equipe.EQUIPE_YELLOW.getLibelle());
            lst_joueur.disable();
            
            idListe = "lst_type" + i;
            lst_joueur = screen.findNiftyControl(idListe, DropDown.class);
            lst_joueur.addItem("");
            lst_joueur.addItem("Joueur");
            lst_joueur.addItem("IA (facile)");
            lst_joueur.disable();
        }
    }

    public void onStartScreen() {
        
        Screen screen = ((PowerGame2DMain)application).nifty.getCurrentScreen();
        
        // Initialisation 
        Jeu jeu = ((PowerGame2DMain)application).getJeu();
        
        TextField txt = null;
        CheckBox ck = null;
        DropDown<String> lst_equipe = null;
        DropDown<String> lst_type = null;
        
        Joueur j = null;
        for(int i = 1; i <= jeu.getJoueurs().size(); i++){
            j = jeu.getJoueurs().get(i-1);
            
            txt = screen.findNiftyControl("txt_joueur" + i, TextField.class);
            ck = screen.findNiftyControl("ck_joueur" + i, CheckBox.class);
            lst_equipe = screen.findNiftyControl("lst_equipe" + i, DropDown.class);
            lst_type = screen.findNiftyControl("lst_type" + i, DropDown.class);
            
            ck.setChecked(true);
            txt.setText(j.getNom());
            txt.setEnabled(true);
            lst_equipe.selectItem(j.getEquipe().getLibelle());
            lst_type.selectItem("Joueur");
        }
        
        for(int i = jeu.getJoueurs().size() + 1; i <= 4; i++){
            lst_equipe = screen.findNiftyControl("lst_equipe" + i, DropDown.class);
            lst_type = screen.findNiftyControl("lst_type" + i, DropDown.class);
            
            lst_equipe.disable();
            lst_type.disable();
        }
    }

    public void onEndScreen() {
    }
    
    public void startGame(){
        
        // Initialisation des joueurs 
        
        
        ((PowerGame2DMain)application).play();
    }
    
    public void exitGame(){
        this.application.stop();
    }
    
    @NiftyEventSubscriber(pattern="ck_joueur*.")
    public void onCheckBoxStateChange(final String id, CheckBoxStateChangedEvent event){
        
        Screen screen = ((PowerGame2DMain)application).nifty.getCurrentScreen();
        
        TextField txt = null;
        CheckBox ck = null;
        DropDown<String> lst_equipe = null;
        DropDown<String> lst_type = null;
        
        for(int i = 1; i <= 4; i++){
            txt = screen.findNiftyControl("txt_joueur" + i, TextField.class);
            ck = screen.findNiftyControl("ck_joueur" + i, CheckBox.class);
            lst_equipe = screen.findNiftyControl("lst_equipe" + i, DropDown.class);
            lst_type = screen.findNiftyControl("lst_type" + i, DropDown.class);
            
            if(id.equals(ck.getId())){
                txt.setEnabled(event.isChecked());
                lst_equipe.setEnabled(event.isChecked());
                lst_type.setEnabled(event.isChecked());
            }
        }
    }
}
